//
//  Status.swift
//  SinaWeibo25
//
//  Created by Apple on 16/3/10.
//  Copyright © 2016年 itcast. All rights reserved.
//

import UIKit
import AFNetworking

class Status: NSObject {

    //	微博创建时间
    var created_at: String?
    //微博id  Int 和 OC 中的 NSInteger 是一样的  在OC中 需要使用 long long
    //NSInteger 在32机型上 默认的整形数据的长度 是32位的
    // 在64机型上 默认的整形数据的长度 是64位的
    var id: Int64 = 0
    
    //微博正文
    var text: String?
    //微博来源
    var source: String?
    
    var user: User?
    
    
    var retweeted_status: Status?
    
    
    //配图字典数组
    var pic_urls: [[String : String]]? {
        didSet {
            //给imageURLs赋值
            guard let urls = pic_urls else {
                //如果pic_urls为空 直接不给 imageURLs赋值
                return
            }
            
            
            //实例化属性
            imageURLs = [NSURL]()
            for item in urls {
                let urlString = item["thumbnail_pic"]
                //相信后端给定的 第一个 '!' urlString  一定存在
                //第二个 '!' 相信后端给定的url一定可以得到NSURL对象
                let url = NSURL(string: urlString!)!
                imageURLs?.append(url)
            }
        }
    }
    
    //视图层 需要用什么数据 在模型层 就直接处理好 外界直接使用就行啦
    var imageURLs: [NSURL]?
    
    
    init(dict: [String : AnyObject]) {
        super.init()
        //循环遍历键值 给对象发送 setValue: forKey的消息
        setValuesForKeysWithDictionary(dict)
    }
    
    override func setValue(value: AnyObject?, forKey key: String) {
        //需要对 user 做特殊处理
        if key == "user" {
            guard let dict = value as? [String : AnyObject] else {
                //不能转换为字典类型
               return
            }
            
            //字典转模型
            user = User(dict: dict)
            //必须要添加return  不然字典转模型就白做了
            return
        }
        
        
        if key == "retweeted_status" {
            guard let dict = value as? [String : AnyObject] else {
                //不能转换为字典类型
                return
            }
            
            //字典转模型
            retweeted_status = Status(dict: dict)
            //必须要添加return  不然字典转模型就白做了
            return
        }
        
        
        super.setValue(value, forKey: key)
    }
    //过滤
    override func setValue(value: AnyObject?, forUndefinedKey key: String) { }
    
    //MARK: 重写描述方法
    override var description: String {
        let keys = ["id","text","created_at","source"]
        let dict = self.dictionaryWithValuesForKeys(keys)
        return dict.description
    }
}

//网络访问
//tableView 需要 模型数组数据  字典转模型
extension Status {
    
    class func loadHomeData(finished: (array: [Status]?) -> () ) {
        
        guard let token = UserAccount.shareAccount.access_token else {
            print("用户为登录,或者登录过期")
            return
        }
        
        let urlStirng = "https://api.weibo.com/2/statuses/home_timeline.json"
        let parameters = ["access_token" : token]
        
        //实例化网络请求对象
        let AFN = AFHTTPSessionManager()
        
        //发起get请求
        AFN.GET(urlStirng, parameters: parameters, progress: nil, success: { (_, result) -> Void in
            print(result)
            //转换为字典类型
            /// 极大的减少分之嵌套
            guard let dict = result as? [String : AnyObject] else {
                finished(array: nil)
                print("数据结构错误")
                return
            }
            
            guard let array = dict["statuses"] as? [[String : AnyObject]] else {
                print("数据结构错误")
                finished(array: nil)
                return
            }
            
            
            //实例化临时数组
            var tempArray = [Status]()
            //遍历数组 
            for item in array {
                //字典转模型
                let s = Status(dict: item)
                //添加模型数据
                tempArray.append(s)
            }
            
            //刷新页面
            finished(array: tempArray)
        
            }) { (_, error) -> Void in
                finished(array: nil)
                print(error)
        }
    }
}
